package org.fujay.commons.langchain4j.rag.processor;

import dev.langchain4j.data.document.Document;
import dev.langchain4j.data.segment.TextSegment;
import dev.langchain4j.store.embedding.EmbeddingStore;
import org.fujay.commons.langchain4j.rag.processor.result.DocumentProcessResult;

import java.nio.file.Path;
import java.util.List;
import java.util.concurrent.CompletableFuture;

/**
 * @author slm
 * @description 文档处理器
 *              负责处理文档的加载、分块、向量化和存储等操作
 */
public interface DocumentProcessor {

    /**
     * 根据存储位置加载文档
     */
    Document loadDocument(String path, int storageLocation);

    /**
     * 处理单个文档并存储到向量数据库
     *
     * @param document 要处理的文档
     * @return 处理结果，包含处理统计信息
     */
    DocumentProcessResult process(Document document);

    /**
     * 处理多个文档并存储到向量数据库
     *
     * @param documents 要处理的文档列表
     * @return 处理结果，包含处理统计信息
     */
    DocumentProcessResult process(List<Document> documents);

    /**
     * 处理单个文档并存储到指定向量数据库
     *
     * @param document       要处理的文档
     * @param embeddingStore 指定的向量数据库
     * @return 处理结果，包含处理统计信息
     */
    DocumentProcessResult process(Document document, EmbeddingStore<TextSegment> embeddingStore);

    /**
     * 处理多个文档并存储到指定向量数据库
     *
     * @param documents      要处理的文档列表
     * @param embeddingStore 指定的向量数据库
     * @return 处理结果，包含处理统计信息
     */
    DocumentProcessResult process(List<Document> documents, EmbeddingStore<TextSegment> embeddingStore);

    /**
     * 从文件加载并处理文档
     *
     * @param filePath 文件路径
     * @return 处理结果，包含处理统计信息
     */
    DocumentProcessResult processFile(Path filePath);

    /**
     * 从多个文件加载并处理文档
     *
     * @param filePaths 文件路径列表
     * @return 处理结果，包含处理统计信息
     */
    DocumentProcessResult processFiles(List<Path> filePaths);

    /**
     * 从目录加载并处理所有文档
     *
     * @param directoryPath 目录路径
     * @param recursive     是否递归处理子目录
     * @return 处理结果，包含处理统计信息
     */
    DocumentProcessResult processDirectory(Path directoryPath, boolean recursive);

    /**
     * 异步处理文档
     *
     * @param documents 要处理的文档列表
     * @return 包含处理结果的CompletableFuture
     */
    CompletableFuture<DocumentProcessResult> processAsync(List<Document> documents);

    /**
     * 从文档库中删除与指定文档关联的所有向量
     *
     * @param documentId 文档ID
     * @param index      是否删除整个索引
     */
    void removeDocument(String documentId, Boolean index);

    void removeDocuments(List<String> documents, Boolean index);

    /**
     * 获取处理器的当前配置
     *
     * @return 处理器配置
     */
    DocumentProcessorConfig getConfig();
}
